/*
Copyright (C) 2008 raohmaru <http://www.raohmaru.com>

This file is part of Raohmaru AS3 Framework.

Raohmaru AS3 Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Raohmaru AS3 Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Raohmaru AS3 Framework.  If not, see <http://www.gnu.org/licenses/>.
*/

package jp.raohmaru.utils 
{

/**
 * Conjunto de métodos que amplían las funcionalidades de la clase Number.
 * @see Number
 * @author raohmaru
 * @version 1.2
 */
public class NumberUtil 
{
	/**
	* Comprueba si un número es par.
	* @return Boolean
	* @param value Número a comprobar
	*/
	public static function isEven(value : Number) : Boolean 
	{
		return( (value & 1) == 0 );
	}
	
	/**
	* Comprueba si un valor númerico es un entero.
	* @return Boolean
	* @param value Número a comprobar
	*/
	public static function isInt(value : Number) : Boolean 
	{
		//return  value.toString().indexOf(".") == -1;
		return (value - Math.floor(value) == 0);
	}
	
	/**
	* Comprueba si el valor es un número de coma flotante.
	* @return Boolean
	* @param value Número a comprobar
	*/
	public static function isFloat(value : Number) : Boolean 
	{
		//return value.toString().indexOf(".") != -1;
		return (value - Math.floor(value) != 0);
	}	

	/**
	* Devuelve <code>true</code> si el valor es <code>NaN</code> (no es un número).
	* Este método es una versión optimizada de la funcion global <code>isNaN()</code>.
	* @return Boolean Devuelve <code>true</code> si el valor es <code>NaN</code> (no es un número) y <code>false</code> en caso contrario. 
	* @param value Valor numérico o expresión matemática que se va a evaluar.
	* @see isNaN
	* @author Jackson Dunstan <http://jacksondunstan.com/articles/983>
	*/
	public static function isNaN(value :Number) :Boolean 
	{
		return value != value;
	}
	
	/**
	* Devuelve <code>true</code> si el valor es un número.
	* Este método es una versión optimizada de la funcion global <code>!isNaN()</code>.
	* @return Boolean Devuelve <code>true</code> si el valor es un número y <code>false</code> en caso contrario (es NaN). 
	* @param value Valor numérico o expresión matemática que se va a evaluar.
	* @author Jackson Dunstan <http://jacksondunstan.com/articles/983>
	* @see #isNaN()
	*/
	public static function isNotNaN(value :Number) :Boolean 
	{
		return value == value;
	}
	
	/**
	* Devuelve el número de decimales que contiene un número
	* @return uint
	* @param n Número
	*/
	public static function decimalLenght(n : Number) : uint
	{
		if(!isFloat(n)) return 0;
		
		var n_str : String = n.toString().split(".")[1];
		return n_str.length;
	}
	
	/**
	 * Obtiene un valor de color ARGB a partir de un color RGB y un valor de alpha.
	 * @return Un color en formato ARGB.
	 * @param rgb El valor de un color RGB en hexadecimal.
	 * @param newAlpha La cantidad de transparencia asignada al color. Debe ser un valor comprendido entre 0x00 y 0xFF (0 y 255).
	 */
	public static function colorToARGB(rgb :uint, alpha :uint = 255) :uint
	{
		if(alpha > 255) alpha = 255;
		
		return (alpha<<24) + rgb;
	}

	/**
	 * Redondea el número en notación de coma fija. La notación de coma fija significa que la cadena contendrá un número concreto de
	 * dígitos tras la coma decimal, conforme a lo especificado en el parámetro <code>fractionDigits</code>. El rango válido para el
	 * parámetro <code>fractionDigits</code> va de 0 a 20. Al especificar un valor situado fuera de este rango, se emite una excepción. 
	 * @return Number
	 * @param n Número a redondear.
	 * @param fractionDigits Un entero entre 0 y 20, ambos inclusive, que representa el número deseado de cifras decimales.
	 * @see Number.toFixed()
	 */
	public static function toFixed(n :Number, fractionDigits:uint) :Number
	{
		return Number( n.toFixed(fractionDigits) );
	}

}
}